package com.cskaoyan._09override._01basic;

/**
 * @description:
 * @author: 景天
 * @date: 2023/2/9 16:38
 **/
/*
通过对象名.成员方法名调用方法的机制

2个角度研究:
1.访问的范围(编译的角度, .出来的范围),取决于什么
2.访问的结果(运行的结果),取决于什么

3种创建对象的方式:
1.父类引用指向父类对象
2.子类引用指向子类对象
3.父类引用指向子类对象

代码测试:
    1.父类引用指向父类对象
        访问范围----->父
        访问结果----->父
    2.子类引用指向子类对象
        访问范围---->子
        访问结果---->子
    3.父类引用指向子类对象
        访问的范围---->父
        访问的结果---->子

    结论:
        1.访问的范围取决于引用的数据类型(编译看左边)
        2.访问的结果取决于具体的对象的类型(运行时看右边)

 */
public class Demo {
    public static void main(String[] args) {
        //1.父类引用指向父类对象
        Father father = new Father();
        father.onlyFather();
        father.test();
        System.out.println("--------------");

        //2.子类引用指向子类对象
        Son son = new Son();
        son.sonOnly();
        son.test();
        System.out.println("--------------");

        //3.父类引用指向子类对象
        Father fs = new Son();
        fs.test();
        //fs.onlyFather();
        // ((Son) fs).sonOnly();
    }
}

class Father{
    // 跟子类同名的方法
    public void test() {
        System.out.println("father中的test方法");
    }

    // 父类中独有的方法
    public void onlyFather() {
        System.out.println("father中独有的方法");
    }
}

class Son extends Father{
    // 定义跟父类同名的test方法
    public void test() {
        System.out.println("son中的test方法");
    }

    // 子类中独有的方法
    public void sonOnly() {
        System.out.println("son中独有的方法");
    }
}